#importing import scipy as scimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom matplotlib import cmfrom matplotlib.patches import Polygonfrom matplotlib.colors import Normalizefrom mpl_toolkits.basemap import Basemap%matplotlib inlineВ этом задании вам предстоит научиться работать с географическими данными. В Питоне есть огромное количество библиотек, позволяющих эти данные обрабатывать и визуализировать; выберите ту, которая вам больше понравится. Вам может помочь руководство kaggle по работе с картами: "Семнадцать способов рисовать данные на картах". Смотрите также:модуль basemap (пример, ещё пример)плагин gmapsвиджет ipyleaflet (крайне минималистичный пример)модуль foliumПоскольку мы агрегировали данные по равномерной сетке, можно ожидать, что существенное количество ячеек окажется в районах города, где вызов такси невозможен (реки, заливы, острова, парки). Теоретически ряды, соответствующие таким ячейка, должны состоять из одних нулей, но на практике это может быть не так: устройства, определяющие координаты автомобилей в момент начала поездки, несовершенны и могут ошибаться, показывая, например, что такси находится в середине реки. Чтобы правильно отобрать ячейки, вам понадобится визуализировать их границы на карте и отфильтровать те, из которых поездки на такси невозможны.Чтобы сдать задание, выполните следующую последовательность действий.Загрузите агрегированные данные о поездках в мае 2016. Просуммируйте общее количество поездок такси из каждой географической зоны и посчитайте количество ячеек, из которых в мае не было совершено ни одной поездки.Нарисуйте статическую карту Нью-Йорка. Поставьте на карте точку там, где находится Эмпайр-Стейт-Билдинг.Поверх статической карты Нью-Йорка визуализируйте данные о поездках из каждой ячейки так, чтобы цветовая шкала, в которую вы окрашиваете каждую ячейку, показывала суммарное количество поездок такси из неё.Вставьте интерактивную карту Нью-Йорка — такую, которую можно прокручивать и увеличивать. Поставьте метку там, где находится статуя свободы.Нарисуйте на интерактивной карте Нью-Йорка ячейки так, чтобы их цвет показывал среднее за месяц количество поездок такси в час из этой зоны.Чтобы не выбирать из всех 2500 ячеек вручную, отфильтруйте ячейки, из которых в мае совершается в среднем меньше 5 поездок в час. Посчитайте количество оставшихся. Проверьте на карте, что среди этих ячеек нет таких, из которых поездки на самом деле невозможны.Сохраните ноутбук в формате html, запакуйте ipynb и html в один архив и загрузите его в форму (html облегчит задачу проверки вашим рецензентам — в ipynb динамические карты часто не сохраняются, а для выполнения кода рецензентам придётся устанавливать все библиотеки).В этом задании вам предстоит научиться работать с географическими данными. В Питоне есть огромное количество библиотек, позволяющих эти данные обрабатывать и визуализировать; выберите ту, которая вам больше понравится. Вам может помочь руководство kaggle по работе с картами: "Семнадцать способов рисовать данные на картах". Смотрите также:
модуль basemap (пример, ещё пример) плагин gmaps виджет ipyleaflet (крайне минималистичный пример) модуль folium
Поскольку мы агрегировали данные по равномерной сетке, можно ожидать, что существенное количество ячеек окажется в районах города, где вызов такси невозможен (реки, заливы, острова, парки). Теоретически ряды, соответствующие таким ячейка, должны состоять из одних нулей, но на практике это может быть не так: устройства, определяющие координаты автомобилей в момент начала поездки, несовершенны и могут ошибаться, показывая, например, что такси находится в середине реки. Чтобы правильно отобрать ячейки, вам понадобится визуализировать их границы на карте и отфильтровать те, из которых поездки на такси невозможны.
Чтобы сдать задание, выполните следующую последовательность действий.
Загрузите агрегированные данные о поездках в мае 2016. Просуммируйте общее количество поездок такси из каждой географической зоны и посчитайте количество ячеек, из которых в мае не было совершено ни одной поездки. Нарисуйте статическую карту Нью-Йорка. Поставьте на карте точку там, где находится Эмпайр-Стейт-Билдинг. Поверх статической карты Нью-Йорка визуализируйте данные о поездках из каждой ячейки так, чтобы цветовая шкала, в которую вы окрашиваете каждую ячейку, показывала суммарное количество поездок такси из неё.
Вставьте интерактивную карту Нью-Йорка — такую, которую можно прокручивать и увеличивать. Поставьте метку там, где находится статуя свободы.
Нарисуйте на интерактивной карте Нью-Йорка ячейки так, чтобы их цвет показывал среднее за месяц количество поездок такси в час из этой зоны.
Чтобы не выбирать из всех 2500 ячеек вручную, отфильтруйте ячейки, из которых в мае совершается в среднем меньше 5 поездок в час. Посчитайте количество оставшихся. Проверьте на карте, что среди этих ячеек нет таких, из которых поездки на самом деле невозможны.
Сохраните ноутбук в формате html, запакуйте ipynb и html в один архив и загрузите его в форму (html облегчит задачу проверки вашим рецензентам — в ipynb динамические карты часто не сохраняются, а для выполнения кода рецензентам придётся устанавливать все библиотеки).
#Загружаем агрегированные данные, полученные на 1-й неделе и удаляем ненулевые колонкиdata5=pd.read_csv('Agg20165.csv',parse_dates=['tpep_pickup_datetime'])data5.drop('Unnamed: 0', axis=1, inplace=True)data5.head(3)#получим суммарное количество поездок из областейgrouper = data5[['region','count']].groupby('region')res = grouper.sum()res.reset_index(inplace=True)res.head()# информация о данныхData=res[res["count"]>0]Data2=resprint "Пустых областей=", len(res[res["count"]==0]) ,", Областей с поездками=", len(res[res["count"]!=0])Data[['count']].describe().transpose()#загрузим данные по областям , их идентификаторам и координатамreg=pd.read_csv('regions.csv', sep=';')reg.head()#Получим координаты сетки областей lon_list= sorted(list(set(np.concatenate((reg.west.values,reg.east.values),axis=0))))lat_list= sorted( list(set(np.concatenate((reg.south.values,reg.north.values),axis=0))))# проведем join данных: агрегированные данные, область и координатыMD=pd.merge(Data, reg, on='region', how='left')MD2=pd.merge(Data2, reg, on='region', how='left')MD.head()# вспопогательные переменные и функции. координыты центров областей и функция возращающая количество поездокlons = lon_listlats = lat_list# координаты центров областейlons_c = sorted(list(set((MD2['west'].values+MD2[ 'east'].values)/2.0)))lats_c = sorted(list(set((MD2['south'].values+MD2[ 'north'].values)/2.0)))#определение количества поездок из областей по координатам центра или порядковым номерамdef r(lon,lat): return (MD2[(MD2.west<=lon) & (MD2.east>=lon) & (MD2.south<=lat) & (MD2.north>=lat)]['count'].iloc[0]) #(reg['south']<=40.748817) & (reg['north']>=40.748817) & (reg['west']<=-73.985428) & (reg['east']>=-73.985428)def ri(x,y): lon=lons_c[x] lat=lats_c[y] return r(lon,lat) Нью-Йорк вписан в прямоугольник от -74.25559 до -73.70001 градусов долготы и от 40.49612 до 40.91553 широтыНью-Йорк вписан в прямоугольник от -74.25559 до -73.70001 градусов долготы и от 40.49612 до 40.91553 широты
координаты Эмпайр стейт билдинг 40.74778, -73.98583координаты Статуи Свободы 40.689166676667, -74.044583343333координаты Эмпайр стейт билдинг 40.74778, -73.98583 координаты Статуи Свободы 40.689166676667, -74.044583343333
# количество поездок из областейc_min=1c_max= MD2.iloc[:, 1].max()#отобразим на статичной карте полученную информациюimport mathimport matplotlib from matplotlib.cm import ScalarMappable#границы Нью-ЙоркаLOW_LEFT_CORNR_LONGITUDE = -74.25559LOW_LEFT_CORNER_LATITUDE = 40.49612UP_RIGHT_CORNER_LONGITUDE = -73.70001UP_RIGHT_CORNER_LATITUDE = 40.91553LON_C=(LOW_LEFT_CORNR_LONGITUDE+UP_RIGHT_CORNER_LONGITUDE)/2.0LAT_C=(LOW_LEFT_CORNER_LATITUDE+UP_RIGHT_CORNER_LATITUDE)/2.0# Create the Basemapfig = plt.figure(figsize=(25,25))m = Basemap(llcrnrlon=LOW_LEFT_CORNR_LONGITUDE, llcrnrlat=LOW_LEFT_CORNER_LATITUDE, urcrnrlon=UP_RIGHT_CORNER_LONGITUDE, urcrnrlat=UP_RIGHT_CORNER_LATITUDE,# resolution='h', area_thresh=0.1)m.arcgisimage(service='ESRI_Imagery_World_2D', xpixels = 1500, verbose= True)# цвет#norm = matplotlib.colors.Normalize(vmin=c_min, vmax=c_max)norm = matplotlib.colors.LogNorm(vmin=c_min, vmax=c_max)cmap = cm.Orangesmapper = matplotlib.cm.ScalarMappable(norm=norm, cmap=cmap)#закрасим областиfor ii,xi in enumerate(lons_c): for jj,yi in enumerate(lats_c): if(r(xi,yi)>0): xxi,yyi=m(xi,yi) x1,y1 = m(lons[ii],lats[jj]) x2,y2 = m(lons[ii],lats[jj+1]) x3,y3 = m(lons[ii+1],lats[jj+1]) x4,y4 = m(lons[ii+1],lats[jj]) poly = Polygon([(x1,y1),(x2,y2),(x3,y3),(x4,y4)],facecolor=mapper.to_rgba((r(xi,yi))),alpha=0.45,linewidth=1,edgecolor='k') plt.gca().add_patch(poly)# Обозначим Empire State buildinglat=40.74778lon= -73.98583x,y=m(lon,lat)m.plot(x, y, marker='D',color='w', markersize=12,alpha=0.8)plt.text(x, y, 'Empire State building', size=15)plt.title('Plotting New York City',weight='bold')#Колорбарcax = fig.add_axes([0.27, 0.1, 0.5, 0.05]) # posititoncb = matplotlib.colorbar.ColorbarBase(cax,cmap=cmap,norm=norm, orientation='horizontal')cb.ax.set_xlabel('Yellow Taxi density of NY',weight='bold',size=17)cb.ax.tick_params(labelsize=15)plt.show()#Вспомогательные функции и информация для второй части задания.# Вычислим среднее количество поездок в часres2=grouper.mean()res2.reset_index(inplace=True)res2.head()print "Областей при среднем количестве поездок не менее 5 в час:", res2[res2['count']>=5].count()[0]MD3=pd.merge(res2, reg, on='region', how='left')def r2(lon,lat): return (MD3[(MD3.west<=lon) & (MD3.east>=lon) & (MD3.south<=lat) & (MD3.north>=lat)]['count'].iloc[0])print "Максимальное среднее кол-во поездок в час ", res2['count'].max()# цветовая гаммаdef getColor(d): s = '#FFEDA0' if d > 800 : return '#bd0026' if d > 500: return '#f03b20' if d > 100: return'#fd8d3c' if d > 50: return '#fecc5c' if d > 5: return'#ffffb2' return s# отобразим интерактивную картуimport foliummap_2 = folium.Map(location=[40.705825, -73.9778], zoom_start=11,tiles='Stamen Terrain')# точка Статуи свободыfolium.Marker(location=[40.689166676667, -74.044583343333], popup='Statue of Liberty').add_to(map_2)for ii,xi in enumerate(lons_c): for jj,yi in enumerate(lats_c): if(r2(xi,yi)>5): x1,y1 = lons[ii],lats[jj] x2,y2 = lons[ii],lats[jj+1] x3,y3 = lons[ii+1],lats[jj+1] x4,y4 = lons[ii+1],lats[jj] folium.PolyLine(locations=[[y1,x1],[y2,x2],[y3,x3],[y4,x4],[y1,x1]], color='black', weight=1).add_to(map_2) folium.CircleMarker([yi, xi], radius=8, popup=str(int(r2(xi,yi))), color=getColor(r2(xi,yi)),fill_color=getColor(r2(xi,yi)),fill_opacity=0.3).add_to(map_2)map_2# отобразим еще один вариант интерактивной карты from folium.plugins import HeatMapmap_3 = folium.Map(location=[40.705825, -73.9778], zoom_start=11)folium.Marker(location=[40.689166676667, -74.044583343333], popup='Statue of Liberty').add_to(map_3)data=[]for ii,xi in enumerate(lons_c): for jj,yi in enumerate(lats_c): x1,y1 = lons[ii],lats[jj] x2,y2 = lons[ii],lats[jj+1] x3,y3 = lons[ii+1],lats[jj+1] x4,y4 = lons[ii+1],lats[jj] folium.PolyLine(locations=[[y1,x1],[y2,x2],[y3,x3],[y4,x4],[y1,x1]], color='black', weight=0.1).add_to(map_3) if(r2(xi,yi)>5): data.append([yi,xi,r2(xi,yi)]) # folium.CircleMarker([yi, xi], radius=8, popup=str(r(xi,yi)), color=getColor(r2(xi,yi)),fill_color=getColor(r2(xi,yi)),fill_opacity=0.3).add_to(map_2)# folium.CircleMarker([yi, xi], radius=8, popup=str(r(xi,yi)), color=getColor(r(xi,yi)),fill_color=r(xi,yi),fill_opacity=0.3,colormap=cm1).add_to(map_2)HeatMap(data, min_opacity=0.5, max_val=859).add_to(map_3)map_3